#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define NUM_KEY  9600

int main(int argc, char const *argv[])
{
    // 1. 定义管道（2组）
    int p1[2], p2[2];
    if(pipe(p1) != 0 || pipe(p2) != 0) {
        perror("pipe");
        return -1;
    }

    if(fork() == 0){
        // 子进程
        close(p1[1]); // 从 p1管道中读取数据，因此关闭写
        close(p2[0]); // 将处理结果写入到p2管道中， 因此关闭读

        // 业务功能实现
        int n = 0;
        while(1){
            read(p1[0], &n, 4);
            if(n == 0) break;

            // 加密处理
            n = n ^ NUM_KEY;  // 简单地异或
            write(p2[1], &n, 4);
        }

        close(p1[0]);
        close(p2[1]);
        _exit(0);
    }

    // 父进程
    close(p1[0]); // 关闭p1读
    close(p2[1]); // 关闭p2写

    // 业务功能实现
    int num = 0;  // 输入的数值
    int ret = 0; // 结果
    while(1){
        // 从键盘输入整数
        printf("Input Number: ");
        scanf("%d", &num);
        // 写入到p1管道中
        write(p1[1], &num, 4);

        if(num == 0) break;
        read(p2[0], &ret, 4);
        printf("Crypt Numer: %d\n", ret);

        num = 0;
        ret = 0;
    }
    wait(NULL);
    close(p1[1]); 
    close(p2[0]);
    return 0;
}
